#ifndef NODOEJERCICIO_H
#define NODOEJERCICIO_H

#include <QList>
#include "patron.h"
#include "contadortiempo.h"

class NodoEjercicio
{
public:
    NodoEjercicio();
    virtual ~NodoEjercicio();

    virtual void iniciar();
    virtual bool haTerminado();

    void iniciarHijos();
    bool hanTerminadoHijos();
    bool tieneHijos();

    virtual Patron getSiguientePatron();

    void agregarNodo(NodoEjercicio* nodo);

    virtual void deserializar(const QDomElement& elementoEjercicio, Proyecto* proyecto);

private:
    QList<NodoEjercicio*> listaNodosHijos;
    int indiceNodoHijo;
};


class NodoEjecucion : public NodoEjercicio
{
public:
    NodoEjecucion();

    bool haTerminado();
    void iniciar();
    Patron getSiguientePatron();

    void agregarPatron(const Patron& patron);

    void deserializar(const QDomElement& elementoEjercicio, Proyecto* proyecto);

private:
    QList<Patron> listaPatrones;
    //bool terminado;
    int indicePatron;
};

class NodoIteracion : public NodoEjercicio
{
public:
    NodoIteracion();

    void setIteraciones(int iteraciones);

    void iniciar();

    Patron getSiguientePatron();

    bool haTerminado();

    void deserializar(const QDomElement& elementoEjercicio, Proyecto* proyecto);

private:
    int iteraciones;
    int contador;
};

class NodoDuracion : public NodoEjercicio
{
public:
    NodoDuracion();

    void setMinutos(int minutos);

    void iniciar();

    Patron getSiguientePatron();

    bool haTerminado();

    void deserializar(const QDomElement& elementoEjercicio, Proyecto* proyecto);

private:
    int minutos;
    int segundos;
    ContadorTiempo contadorTiempo;
};

class NodoCambioTempo : public NodoEjercicio
{
public:
    NodoCambioTempo();

    void setRango(int tempoInicial, int tempoFinal, int incremento);

    void iniciar();

    Patron getSiguientePatron();

    bool haTerminado();

    void deserializar(const QDomElement& elementoEjercicio, Proyecto* proyecto);

private:
    int tempoInicial;
    int tempoFinal;
    int incrementoTempo;

    int tempoActual;
};


#endif // NODOEJERCICIO_H
